'''
Created on 10 déc. 2014

@author: Damien Torond et Geoffrey Sentost
Module Niveau
'''

from modele import Place

'''
import de la classe Place depuis le modele.
'''

class Niveau:
    
    '''
    La classe Niveau permet de modeliser les differents niveaux d'un parking.
    '''

    def __init__(self, parking, pNum, nbPlaces, listePlacesBdd = None):
        '''
        Constructeur de la classe Niveau.
        Attributs:
            - parking de la classe Parking.
            - bdd instance de la classe CtrlBdd.
            - numero de type int, numero de la place.
            - nbPlacesCapacite de type int nombre de places par parking.
            - nbPlacesLibresNiveau de type int, nombre de places par niveaux.
            - listePlaces de type list permet d'ajouter des places.
            - listePlacesBdd de type list qui rempli le nombre de places.
        '''
        self.parking = parking
        self.bdd = parking.bdd
        self.numero = pNum
        self.nbPlacesCapacite = nbPlaces
        self.nbPlacesLibresNiveau = nbPlaces
        self.listePlaces = []
        
        if listePlacesBdd :
            self.remplirListePlaces(listePlacesBdd)
        else :
            self.remplirListePlaces()
        
        
    def getNumNiveau(self):
        '''
        Methode : accesseur de l'attribut numero qui retourne celui-ci.
        '''
        return self.numero
      
        
    def remplirListePlaces(self, listeBdd = None):
        '''
        Methode: Attend une liste en parametre.
        Permet de remplir la liste des places afin de remplir les niveaux et 
        le parking.
        '''
        if listeBdd :
            for row in listeBdd :
                place = Place.Place(self, row[1], row[2], row[3], row[4])
                if row[4] == False :
                    self.decrementer()
                self.listePlaces.append(place)
        else :    
            cpt = 1
            while cpt <= self.nbPlacesCapacite :
                place = Place.Place(self, cpt)
                self.listePlaces.append(place)
                self.bdd.ajouterPlace(place)
                cpt = cpt+1
    
            
    def getListePlaces(self):
        '''
         Methode : accesseur de l'attribut listePlaces qui retourne celui-ci.
        '''
        return self.listePlaces
    
    
    def getNbPlaces(self):
        '''
         Methode : accesseur de l'attribut nbPlacesCapacite qui retourne celui-ci.
        '''
        return self.nbPlacesCapacite
    
    
    def getNbPlacesLibresNiveau(self):
        '''
         Methode : accesseur de l'attribut nbPlacesLibresNiveau qui retourne celui-ci.
        '''
        return self.nbPlacesLibresNiveau
    
    
    def estPlein(self):
        '''
        Methode:verifie si le nombre de places par niveaux est inferieur a 0, et si
        le parking est donc plein.
        '''
        return (self.nbPlacesLibresNiveau <= 0)
    
    
    # on incrémente le nb places libres, donc libère une place dans le niveau
    def incrementer(self):
        '''
        Methode: permet d'incrementer le nombre de places par niveau.
        On incremente le nb places libres, donc libere une place dans le niveau.
        '''
        if self.nbPlacesLibresNiveau <= self.nbPlacesCapacite :
            self.nbPlacesLibresNiveau = self.nbPlacesLibresNiveau+1
            self.parking.incrementer()
        else :
            print("Impossible niveau "+str(self.numero)+" vide")
    
                
    def decrementer(self):
        '''
        Methode:permet de decrementer le nombre de places par niveau.
        On decremente le nb places libres, donc occupe une place dans le niveau.
        '''
        if self.nbPlacesLibresNiveau > 0 :
            self.nbPlacesLibresNiveau = self.nbPlacesLibresNiveau-1
            self.parking.decrementer()
        else :
            print("Impossible niveau "+str(self.numero)+" plein") 
    